package modelo.gestionCarta;
import interfacesRemotas.*;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.*;
import java.awt.*;
import java.io.Serializable;
import javax.swing.JOptionPane;

/**
 * @version 1.0
 * @created 21-mar-2007 21:39:48
 * @author Metodo guardar: Carlos Rodriguez Dominguez
 */
public class Carta implements Serializable 
{
	/**
	 * 
	 */
	private static final long serialVersionUID = -8747309376002561555L;

	private class Impresora {
		int numlineas;
		PrintJob pjob;
		Graphics pg;
		Font grande,peque;

		public Impresora() {
		}

		public boolean inicializar(String nombredoc) {
			numlineas=0;
			grande = new Font( "SansSerif",Font.PLAIN,16 );
			peque = new Font( "SansSerif",Font.PLAIN,12 );

		    Frame f = new Frame( "" );
		    f.pack();

		    pjob = f.getToolkit().getPrintJob( f, nombredoc,null );

		    pg = pjob.getGraphics();

			return true;
		}

		public boolean finalizar() {

		    pg.dispose();
		    pjob.end();
			return true;
		}

		public void imprimeseccion(String nomseccion) {
			numlineas+=2;
		    pg.setFont(grande);

			addlinea(nomseccion, 80);
		}

		public void imprimeproducto(String nomproducto, float precio) {
			numlineas++;
			pg.setFont(peque);

			addlinea(nomproducto, 120);

			addlinea(Float.toString(precio)+" ", 400);
		}

		public boolean addlinea(String linea, int indent) {
			if (numlineas>45) {

			    pg.dispose();
				pg = pjob.getGraphics();
				numlineas=0;
			}

			pg.drawString(linea, indent, 60+numlineas*15);


			return true;
		}
	}



	private int id_carta;
	private ArrayList<Seccion> m_Seccion;
	private String ip;

	/**
	 * Este es el constructor a usar para Carta.
	 * @param id Identificador de la carta.
	 * @param ip Direccion ip del servidor RMI.
	 */
	/*public Carta(int id){
		this.id_carta=id;
		this.m_Seccion = new ArrayList<Seccion>();
	}*/
	
	public Carta(int id, String ip)
	{
		this.id_carta=id;
		this.m_Seccion = new ArrayList<Seccion>();
		this.ip = ip;
	}

	public void finalize() throws Throwable {
	}

	/**
	 *
	 * @param s
	 */
	public void agregarSeccion(Seccion s){
		m_Seccion.add(s);
	}

	@SuppressWarnings("unchecked")
	public void agregarCollection(Collection c){
		m_Seccion.addAll(c);
	}

	/**
	 *
	 * @param nombre_seccion
	 */
	public Seccion buscarSeccion(String nombre_seccion){
		int index = -1;
		
		for (int i =0; i<m_Seccion.size(); i++)
		{
			if (m_Seccion.get(i).getNombreSeccion() == nombre_seccion)
			{
				index = i;
			}
		}
		
		return m_Seccion.get(index);
	}

//	public void guardar(int id_restaurante)
//	{
//		try {
//			// Modificacion de la segunda iteracion
//			
//			InterfazCarta ac = (InterfazCarta)Naming.lookup("//" + this.ip + "/AccesoCarta");
//			
//			ac.deleteCarta(this.id_carta);
//			ac.insertCarta("", id_restaurante,this.id_carta);
//			int idProducto=0;
//
//			for (int i=0;i<m_Seccion.size();i++){
//				ac.insertSeccion(id_carta, m_Seccion.get(i).getNombreSeccion(),i);
//
//				Producto[] prods =m_Seccion.get(i).getProductos();
//				for (int j=0;j<prods.length;j++){
//					ac.insertProducto(idProducto,
//											   i,
//											   prods[j].consultarNombreProducto(),
//											   prods[j].consultarPrecio());
//					idProducto++;
//				}
//			}
//		} catch (MalformedURLException e) {
//			JOptionPane.showMessageDialog(null,"Error en la clase Carta en el metodo guardar: " + e.getMessage());
//		} catch (RemoteException e) {
//			JOptionPane.showMessageDialog(null,"Error en la clase Carta en el metodo guardar: " + e.getMessage());
//		} catch (NotBoundException e) {
//			JOptionPane.showMessageDialog(null,"Error en la clase Carta en el metodo guardar: " + e.getMessage());
//		}
//	}
	
	/**
	 *  @param id_restaurante Id del restaurante al que pertenece la carta
	 */
	public void guardar(int id_restaurante)
	{
		try {
			// Modificacion de la segunda iteracion
			
			InterfazCarta ac = (InterfazCarta)Naming.lookup("//" + this.ip + "/AccesoCarta");
			
			//borrar los elementos que sobran: Si un elemento guardado en la BD no esta en el ArrayList, borrarlo
			//actualizar lo que haga falta: si son iguales las id's, actualizar y no borrar
			Seccion[] secc_BD = ac.getCarta(id_restaurante).getSecciones();
			for (int i =0; i<secc_BD.length; i++)
			{
				int id_seccBD = secc_BD[i].getIdSeccion();
				boolean borrar = true;
				for (int j=0; j<m_Seccion.size() && borrar; j++)
				{
					if (m_Seccion.get(j).getIdSeccion() == id_seccBD)
					{
						ac.updateSeccion(id_seccBD, m_Seccion.get(j).getNombreSeccion());
						
						Producto[] prods = m_Seccion.get(j).getProductos();
						
						//comprobar los que hay que borrar o actualizar
						Producto[] prods_BD = secc_BD[i].getProductos();
						for (int h =0; h<prods_BD.length; h++)
						{
							boolean borrar2 = true;
							int id_prodBD = prods_BD[h].consultarIdProducto();
							
							for (int w = 0; w<prods.length; w++)
							{
								// actualizar, pero no borrar
								if (prods[w].consultarIdProducto() == id_prodBD)
								{
									ac.updateProducto(id_prodBD, prods[w].consultarNombreProducto(), prods[w].consultarPrecio());
									borrar2 = false;
								}
							}
							
							if (borrar2)
							{
								ac.deleteProducto(id_prodBD);
							}
						}
						
						//comprobar los que hay que insertar
						int id_prod = ac.generaIdProducto();
						for (int h = 0; h<prods.length; h++)
						{
							if (prods[h].consultarIdProducto() == -1)
							{
								ac.insertProducto(id_prod, id_seccBD, prods[h].consultarNombreProducto(), prods[h].consultarPrecio());
								prods[h].setIdProducto(id_prod);
								id_prod++;
							}
						}
						
						borrar = false;
					}
				}
				
				if (borrar)
				{
					ac.deleteSeccion(id_seccBD);
				}
			}
			
			//insertar los elementos necesarios
			//obtener el id hipotetico de la una seccion a introducir (el id mas grande+1)
			secc_BD = ac.getCarta(id_restaurante).getSecciones(); //volver a obtener todas las secciones
			int id_secc = 0;
			for (int i =0; i<secc_BD.length; i++)
			{
				if (secc_BD[i].getIdSeccion() > id_secc)
				{
					id_secc = secc_BD[i].getIdSeccion();
				}
			}
			
			id_secc++;
			
			//insertar secciones nuevas: aquellas que no tengan id puesta (=-1, en el constructor de secciones)
			for (int i =0; i<m_Seccion.size(); i++)
			{
				if (m_Seccion.get(i).getIdSeccion() == -1)
				{
					ac.insertSeccion(id_carta, m_Seccion.get(i).getNombreSeccion(), id_secc+i);
					m_Seccion.get(i).setIdSeccion(id_secc+i);
					Producto[] productos = m_Seccion.get(i).getProductos();
					int id_prod = ac.generaIdProducto();
					for (int j =0; j<productos.length; j++)
					{
						ac.insertProducto(id_prod+j, id_secc+i, productos[j].consultarNombreProducto(), productos[j].consultarPrecio());
						productos[j].setIdProducto(id_prod+j);
					}
				}
			}
			
		} catch (MalformedURLException e) {
			JOptionPane.showMessageDialog(null,"Error en la clase Carta en el metodo guardar: " + e.getMessage());
		} catch (RemoteException e) {
			JOptionPane.showMessageDialog(null,"Error en la clase Carta en el metodo guardar: " + e.getMessage());
		} catch (NotBoundException e) {
			JOptionPane.showMessageDialog(null,"Error en la clase Carta en el metodo guardar: " + e.getMessage());
		}
	}

	/**
	 *
	 * @param parametros_impresion
	 */
	public void imprimir(String parametros_impresion){
		Impresora imp = new Impresora();
		imp.inicializar("Carta");


		int numsec=this.getSecciones().length;
    	for (int i=0;i<numsec;i++) {
    		imp.imprimeseccion(this.getSecciones()[i].getNombreSeccion());
    		int numprod=this.getSecciones()[i].getProductos().length;
    		for (int j=0;j<numprod;j++) {
    			imp.imprimeproducto(this.getSecciones()[i].getProductos()[j].consultarNombreProducto(),
    					this.getSecciones()[i].getProductos()[j].consultarPrecio());
    		}
    	}
    	imp.finalizar();

	}

	public void mostrar(){

	}

	public Seccion[] getSecciones(){
		return (Seccion[])m_Seccion.toArray(new Seccion[0]);
	}

	public void eliminarSeccion(int indice){
		m_Seccion.remove(indice);
	}

}
